package com.zwh.se.design_pattern.creational.singleton;

/**
 * 懒汉式（线程安全版本）：<p>
 * 优点：1、实现了懒加载  2、多线程下也能线程安全<p>
 * 缺点：通过加锁 synchronized 才保证的单例，这样使得方法成了同步方法，若该对象使用频率较少倒还好，
 * 若是应用于类似高并发之类的场景，则很容易就会导致性能瓶颈。
 * <p>
 *
 * @author yexi
 */
public class LazySafetyV1 {
    //保持该类在系统中有且只有一个实例
    private static LazySafetyV1 INSTANCE;

    //私有化构造方法
    private LazySafetyV1() {
    }

    //对外界提供统一调用方法获取单例对象。使用同步锁synchronized锁住创建单例的方法，防止多线程同时调用，保证了线程安全。
    public static synchronized LazySafetyV1 getInstance() {
        if (INSTANCE == null) {
            try {
                //模拟在创建对象的过程中稍微出了点问题或者说业务需要，导致慢了一点点。
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //只在调用了方法时才进行初始化(方法调用时才实例化，所以解决了饿汉式的缺点）
            INSTANCE = new LazySafetyV1();
        }
        return INSTANCE;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() ->
                    System.out.println(LazySafetyV1.getInstance().hashCode())
            ).start();
        }
    }

}
